package com.example.demo20220702.schedule.springSchedule;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

/**
 * 定时任务
 * 1、@EnableScheduling 开启定时任务
 * 2、@Scheduled  开启一个定时任务
 * 3、bean给spring管理
 * <p>
 * 异步任务
 * 1、@EnableAsync 开启异步任务功能
 * 2、@Async 给希望异步执行的方法上标注   注意这个不只是只有定时任务才能用
 * 3、bean给spring管理
 * 4、@EnableScheduling 开启定时任务
 * 5、@Scheduled  开启一个定时任务
 */
@Component
@EnableScheduling
@EnableAsync
public class SpringSchedule {
    /**
     * 可以多个定时任务
     * 1、Spring中6位组成(秒 分 时 日 月 周)，不允许第7位的年
     * 2、在周几的位置，1-7代表周一到周日； MON-SUN
     * 3、定时任务不应该阻塞。默认是阻塞的
     * 1）、可以让业务运行以异步的方式，自己提交到线程池
     * CompletableFuture.runAsync(()->{
     * xxxxService.hello();
     * },executor);
     * 2）、支持定时任务线程池；设置 TaskSchedulingProperties；
     * spring.task.scheduling.pool.size=5 默认是1，所以阻塞
     * 不稳定，有时会失效
     * <p>
     * 3）、让定时任务异步执行
     * 异步任务；
     */
    //        @Scheduled(cron = "* * * ? * *")  这样是不行的
    public static void main(String[] args) {
        System.out.println("定时任务执行中");
    }

    //spring的cron比正真的cron少一位年，(秒 分 时 日 月 周)  参考resources图片
    @Scheduled(cron = "* * * ? * *")
    public void test01() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println("定时任务执行中1");
    }

    @Async  //不开启是3秒执行一次，阻塞等待执行完任务执行下一个，开启后到达定时就会触发一个每一个任务单独一个线程去做，每个任务爱执行多少秒执行多少秒
    @Scheduled(cron = "* * * ? * *")
    public void test02() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println("定时任务执行中2");
    }

    @Scheduled(cron = "* * * ? * *")
    public void test03() throws InterruptedException {
//        Thread.sleep(3000);  这里是每次都要等3秒
        CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("定时任务执行中3");
        });

    }

    @Scheduled(cron = "* * * ? * *")
    public void test04() throws InterruptedException {
//        测试配置文件异步  这个不灵
        Thread.sleep(3000);
        System.out.println("定时任务执行中4，测试配置文件异步");
    }
}
